//
//  PersonViewController.swift
//  Swift_base_grammar
//
//  Created by lantaiyuan on 2017/9/14.
//  Copyright © 2017年 lantaiyuan. All rights reserved.
//   03 - 实战

import UIKit

class PersonViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    //个人数据数组
    var persons : [Person]?
    
    lazy var tableView: UITableView = {
        let tableView = UITableView.init(frame: CGRect(x:0,y:0,width:UIScreen.main.bounds.size.width,height:UIScreen.main.bounds.size.height), style: .plain)
            tableView.delegate = self
            tableView.dataSource = self
            tableView.showsVerticalScrollIndicator = false
            tableView.showsHorizontalScrollIndicator = false
            tableView.tableFooterView = UIView()
            tableView.rowHeight = 64
            tableView.separatorStyle = .singleLine
        
        return tableView
    }()
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.title = "person"
        view.backgroundColor = UIColor.white
        view.addSubview(tableView)
        self.tableView.register(UINib.init(nibName: "PersonCell", bundle: nil), forCellReuseIdentifier: "PersonCell")
        //加载数据
        loadPersonData {[weak self](persons) in
            //赋值回调数据
            self?.persons = persons
            self?.tableView.reloadData()
        }
    }
    //从一个vc跳到另外一个vc 调用的方法
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        //1.拿到目标控制器
//        guard let detailVc = segue.destination as! DetailViewController else { return  }
//        
//        // 2. 获取用户当前选中行数据
//        guard let indexPath = tableView.indexPathForSelectedRow else {
//            return
//        }
//        
//        // detailVC & indexPath 全部拿到
//        // 3. 根据 indexPath 获取 person 数据
//        print(persons![indexPath.row])
//        
//        // 4. 传递数据
//        // 1> 个人记录
//        detailVc.person = persons![indexPath.row]
//        
//        detailVc.didSavedCallBack = self.tableView.reloadData
    }
    ///UITableViewDataSource
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return persons?.count ?? 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PersonCell", for: indexPath) as! PersonCell
        // persons 是一定有内容的 -原因：只有有数据，才会调用这个数据源方法
        cell.person = persons![indexPath.row]
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let detailVc = DetailViewController()
        detailVc.persons = persons?[indexPath.row]
        detailVc.didSaveedCallBack = self.tableView.reloadData
        self.navigationController?.pushViewController(detailVc, animated: true)
        
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

// MARK: - 数据处理
// extension 类似于 OC 中的分类，可以将控制器的代码分组，便于维护和管理
extension PersonViewController {
    //加载数据 -->字典数组 --->模型数组
    func loadPersonData(finished:@escaping (_ array:[Person]) ->()) {
    
        DispatchQueue.global().async {
        
            print("耗时操作")
            //1.拼接个人信息数组
            var dataList = [Person]()
        
            //2.生成模拟数据
            for i in 0..<50 {
               let name = "后裔\(i)"
               let age = arc4random() % 20 + 10
               let dict:[String:AnyObject] = ["name":name as AnyObject,"age":age as AnyObject]
               //字典转模型  追加到数组
               dataList.append(Person(dict: dict))
             }
        //3.测试数据
         //\print(dataList)
        DispatchQueue.main.async {
            print("完成数据回调")
            finished(dataList)
        }
     }
   }
}
